// https://www.luogu.com.cn/problem/P4141

#include <iostream>
using namespace std;

const int MAXN = 2005;
int n, m;
int w[MAXN];
int f[MAXN];
int g[MAXN];  // 用来暂时存 g[i][*] 时的数组

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &w[i]);
    }

    // 完整背包 DP，f[j] = 用所有物品恰好填满 j 的方案数 mod 10
    f[0] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = m; j >= w[i]; j--) {
            f[j] = (f[j] + f[j - w[i]]) % 10;
        }
    }

    // 对每一件物品 i，算 g(i, j)
    for (int i = 1; i <= n; i++) {
        // 对 j 从 0 到 m 递推 g(i, j)
        for (int j = 0; j <= m; j++) {
            g[j] = f[j];
            if (j >= w[i]) {
                g[j] = (g[j] - g[j - w[i]] + 10) % 10;
            }
        }
        // 输出 g(j) （j = 1..m）为第 i 行答案
        for (int j = 1; j <= m; j++) {
            printf("%d", g[j]);
        }
        printf("\n");
    }

    return 0;
}
